package com.qtrue.string;

import org.junit.Test;

/**
 * @Package: com.qtrue.string
 * @ClassName: StringBufferAndStringBuilderTest
 * @Author: xiaoBao
 * @CreateTime: 2022-05-26 11:25
 * @Description:关于StringBuffer和StringBuilder的使用
 */
public class StringBufferAndStringBuilderTest {
    /*
        String、StringBuffer、StringBuilder三者的异同？
        String：不可变的字符序列，底层使用char[]存储
        StringBuffer：可变的字符序列：线程安全的，效率低；底层使用char[]存储
        StringBuilder：可变的字符序列：jdk5.0新增的，线程不安全的，效率高；底层使用char[]存储

        源码分析：
            String str = new String(); // char[] value = new char[0]   相当于new了一个长度为0的数组
            String str1 = new String("abc"); // char[] value = new char[]{'a','b','c'};

            StringBuffer sb1 = new StringBuffer(); // char[] value = new char[16]  相当于底层创建了一个长度为16的数组
            sb1.append('a'); // value[0] = 'a';
            sb1.append('b'); // value[1] = 'b';

            StringBuffer sb2 = new StringBuffer("abc"); // char[] value = new char["abc".length() + 16];

            问题1：System.out.println(sb2.length()); // 3
            问题2：扩容问题：如果要添加的数据底层数组装不下了，那就需要扩容底层数组。
                默认情况下，扩容为原来容量的2倍 + 2，同时将原有数组中的元素赋值到新的数组中。

        指导意义：
            在开发当中建议我们使用StringBuffer(int capacity) 或 StringBuilder(int capacity)。
    */
    @Test
    public void test01(){
        StringBuffer sb1 = new StringBuffer("abc");
        sb1.replace(0,1,"m");
        // 体现了StringBuffer的可变性，不需要通过变量来存储修改后的字符串，只要修改内容，其本身的数据也跟着改变了。
        System.out.println(sb1); // mbc

        StringBuffer sb2 = new StringBuffer();
        System.out.println(sb2.length()); // 0
    }
}